#include<bits/stdc++.h>
using namespace std;
int main(){
  freopen("nim.in","r",stdin);
  freopen("nim.out","w",stdout);
  ios::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);
  int n,x,a,b; cin>>n>>x>>a>>b,x--;
  if(a<=b)cout<<"1\n",exit(0);
  vector<vector<int> > g(n);
  for(int i=1;i<n;i++){
    int u,v; cin>>u>>v;
    g[--u].emplace_back(--v);
    g[v].emplace_back(u);
  }
  if(n<=3000){
    vector<int> d(n);
    vector<vector<int> > k(n,vector<int>(n));
    vector<vector<int> > ma(n),mb(n),mc(n),t(n);
    for(int r=0;r<n;r++){
      vector<int> d(n);
      function<void(int,int,int)> dfs=[&](int u,int p,int ky){
        k[r][u]=ky;
        if(d[u]<=b)mc[r].emplace_back(u);
        for(int i:g[u])
          if(i!=p)d[i]=d[u]+1,dfs(i,u,ky<0?i:ky);
      };
      dfs(r,r,-1);
    }
    function<void(int,int)> dfs=[&](int u,int f){
      for(int i:g[u])
        if(i!=f){
          d[i]=d[u]+1,dfs(i,u);
          for(int j:t[i])
            t[u].emplace_back(j);
        }
      t[u].emplace_back(u);
      for(int i:t[u]){
        if(d[i]==d[u]+a)ma[u].emplace_back(i);
        if(d[i]<=d[u]+b)mb[u].emplace_back(i);
      }
    };
    for(int i=0;i<n;i++){
      sort(ma[i].begin(),ma[i].end(),[&](int x,int y){
        return d[x]<d[y];
      });
      sort(mb[i].begin(),mb[i].end(),[&](int x,int y){
        return d[x]<d[y];
      });
      sort(mc[i].begin(),mc[i].end(),[&](int x,int y){
        return d[x]<d[y];
      });
    }
    dfs(x,x);
    vector<vector<int> > f(n,vector<int>(n+1,-1));
    function<int(int,int)> dfs2=[&](int u,int p){
      if(~f[u][p+1])return f[u][p+1];
      int c=0;
      bool b=false;
      for(int i:ma[u]){
        if(p>=0&&k[u][i]==k[u][p])continue;
        int s=n;
        for(int j:mc[i])
          s=min(s,dfs2(j,i==j?u:i));
        c=max(c,s),b=true;
      }
      if(!b){
        c=n;
        for(int i:mb[u])
          if(p<0||k[u][i]!=k[u][p])c=min(c,i);
        return f[u][p+1]=c;
      }
      return f[u][p+1]=c;
    };
    cout<<dfs2(x,-1)+1<<endl;
  }
  return 0;
}